const jwt = require('jsonwebtoken');
const User = require('../models/user.model');
const { AppError } = require('../utils/error');

// 获取JWT密钥
const JWT_SECRET = process.env.JWT_SECRET || 'your-default-jwt-secret-key';
const JWT_EXPIRES_IN = process.env.JWT_EXPIRES_IN || '1d';

/**
 * 注册新用户
 * @param {Object} userData - 用户数据
 * @returns {Promise<Object>} - 新创建的用户对象
 */
exports.register = async (userData) => {
  // 检查用户名是否已存在
  const existingUsername = await User.findOne({ username: userData.username });
  if (existingUsername) {
    throw new AppError('用户名已被使用', 400);
  }

  // 检查邮箱是否已存在
  const existingEmail = await User.findOne({ email: userData.email });
  if (existingEmail) {
    throw new AppError('邮箱已被注册', 400);
  }

  // 创建新用户
  const user = new User(userData);
  await user.save();

  return user;
};

/**
 * 用户登录
 * @param {string} email - 用户邮箱
 * @param {string} password - 用户密码
 * @returns {Promise<Object>} - 包含用户信息和令牌的对象
 */
exports.login = async (email, password) => {
  // 查找用户
  const user = await User.findOne({ email });
  if (!user) {
    throw new AppError('邮箱或密码不正确', 401);
  }

  // 验证密码
  const isPasswordValid = await user.comparePassword(password);
  if (!isPasswordValid) {
    throw new AppError('邮箱或密码不正确', 401);
  }

  // 更新最后登录时间
  user.lastLogin = new Date();
  await user.save();

  // 生成JWT令牌
  const token = generateToken(user);

  return {
    user,
    token,
  };
};

/**
 * 生成JWT令牌
 * @param {Object} user - 用户对象
 * @returns {string} - JWT令牌
 */
const generateToken = (user) => jwt.sign(
  {
    id: user._id,
    username: user.username,
    role: user.role,
  },
  JWT_SECRET,
  { expiresIn: JWT_EXPIRES_IN },
);

/**
 * 验证JWT令牌
 * @param {string} token - JWT令牌
 * @returns {Object} - 解码后的令牌数据
 */
exports.verifyToken = (token) => {
  try {
    return jwt.verify(token, JWT_SECRET);
  } catch (error) {
    throw new AppError('无效或过期的令牌', 401);
  }
};
